00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _optimizer_hpp_
00022 #define _optimizer_hpp_
00023
00024 #include <vector>
00025 #include <map>
00026 #include <boost/scoped_ptr.hpp>
00027 #include <gridpack/utilities/uncopyable.hpp>
00028 #include <gridpack/utilities/exception.hpp>
00029 #include <gridpack/configuration/configurable.hpp>
00030 #include <gridpack/parallel/distributed.hpp>
00031 #include <gridpack/expression/expression.hpp>
00032 #include <gridpack/expression/functions.hpp>
00033
00034 namespace gridpack {
00035 namespace optimization {
00036
00037
00038
00039
00040 class OptimizerInterface
00041 : private utility::Uncopyable
00042 {
00043 public:
00044
00045
00046 OptimizerInterface(void)
00047 {}
00048
00049
00050 virtual ~OptimizerInterface(void)
00051 {}
00052
00053
00054 virtual void setFilename(std::string file)
00055 {
00056 this->p_setFilename(file);
00057 }
00058
00059
00060 void addVariable(VariablePtr v)
00061 {
00062 this->p_addVariable(v);
00063 }
00064
00065
00066
00067
00068 void addAuxVariable(VariablePtr v)
00069 {
00070 this->p_addAuxVariable(v);
00071 }
00072
00073
00074 void addConstraint(ConstraintPtr c)
00075 {
00076 this->p_addConstraint(c);
00077 }
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089 void createGlobalConstraint(const std::string& name, ConstraintPtr cons)
00090 {
00091 this->p_createGlobalConstraint(name, cons);
00092 }
00093
00094
00095 void addToGlobalConstraint(const std::string& name, ExpressionPtr expr)
00096 {
00097 if (expr) this->p_addToGlobalConstraint(name, expr);
00098 }
00099
00100
00101 void addToObjective(ExpressionPtr expr)
00102 {
00103 if (expr) this->p_addToObjective(expr);
00104 }
00105
00106
00107 void maximize(void)
00108 {
00109 this->p_solve(Maximize);
00110 }
00111
00112
00113 void minimize(void)
00114 {
00115 this->p_solve(Minimize);
00116 }
00117
00118 protected:
00119
00120
00121 enum p_optimizeMethod { Maximize, Minimize };
00122
00123
00124 virtual void p_setFilename(std::string file) = 0;
00125
00126
00127 virtual void p_addVariable(VariablePtr v) = 0;
00128
00129
00130
00131
00132 virtual void p_addAuxVariable(VariablePtr v) = 0;
00133
00134
00135 virtual void p_addConstraint(ConstraintPtr c) = 0;
00136
00137
00138 virtual void p_createGlobalConstraint(const std::string& name, ConstraintPtr cons) = 0;
00139
00140
00141 virtual void p_addToGlobalConstraint(const std::string& name, ExpressionPtr expr) = 0;
00142
00143
00144 virtual void p_addToObjective(ExpressionPtr expr) = 0;
00145
00146
00147 virtual void p_solve(const p_optimizeMethod& m) = 0;
00148
00149 };
00150
00151
00152
00153
00154 class OptimizerImplementation
00155 : public OptimizerInterface,
00156 public parallel::Distributed,
00157 public utility::Configurable
00158 {
00159 public:
00160
00161
00162 typedef std::map<std::string, VariablePtr> VarMap;
00163
00164
00165 OptimizerImplementation(const parallel::Communicator& comm)
00166 : OptimizerInterface(),
00167 parallel::Distributed(comm),
00168 utility::Configurable("Optimizer")
00169 {}
00170
00171
00172 ~OptimizerImplementation(void)
00173 {}
00174
00175 protected:
00176
00177
00178 std::vector<VariablePtr> p_variables;
00179
00180
00181 std::vector<VariablePtr> p_aux_variables;
00182
00183
00184 std::vector<ConstraintPtr> p_constraints;
00185
00186
00187 ExpressionPtr p_objective;
00188
00189
00190 VarMap p_allVariables;
00191
00192
00193 VarMap p_exportVariables;
00194
00195
00196 VarMap p_auxVariables;
00197
00198
00199 std::vector<ConstraintPtr> p_allConstraints;
00200
00201
00202 ExpressionPtr p_fullObjective;
00203
00204
00205 typedef std::map<std::string, ConstraintPtr> ConstraintMap;
00206
00207
00208 ConstraintMap p_globalConstraints;
00209
00210
00211 ConstraintMap p_allGlobalConstraints;
00212
00213
00214 void p_addVariable(VariablePtr v)
00215 {
00216 p_variables.push_back(v);
00217 }
00218
00219
00220
00221
00222 virtual void p_addAuxVariable(VariablePtr v)
00223 {
00224 p_aux_variables.push_back(v);
00225 }
00226
00227
00228 void p_addConstraint(ConstraintPtr c)
00229 {
00230 p_constraints.push_back(c);
00231 }
00232
00233
00234 void p_createGlobalConstraint(const std::string& name, ConstraintPtr cons);
00235
00236
00237 void p_addToGlobalConstraint(const std::string& name, ExpressionPtr expr);
00238
00239
00240 ConstraintPtr p_getGlobalConstraint(const std::string& name);
00241
00242
00243 void p_addToObjective(ExpressionPtr expr)
00244 {
00245 if (p_objective) {
00246 p_objective = p_objective + expr;
00247 } else {
00248 p_objective = expr;
00249 }
00250 }
00251
00252
00253 void p_gatherGlobalConstraints(const ConstraintMap& tmpglobal);
00254
00255
00256 void p_gatherProblem(void);
00257 };
00258
00259
00260
00261
00262 class Optimizer
00263 : public OptimizerInterface,
00264 public parallel::WrappedDistributed,
00265 public utility::WrappedConfigurable
00266 {
00267 public:
00268
00269
00270 Optimizer(const parallel::Communicator& comm);
00271
00272
00273 ~Optimizer(void);
00274
00275 protected:
00276
00277
00278 boost::scoped_ptr<OptimizerImplementation> p_impl;
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288 void p_setImpl(OptimizerImplementation *impl)
00289 {
00290 p_impl.reset(impl);
00291 p_setDistributed(p_impl.get());
00292 p_setConfigurable(p_impl.get());
00293 }
00294
00295 void p_preconfigure(utility::Configuration::CursorPtr theprops);
00296
00297 void p_setFilename(std::string file)
00298 {
00299 p_impl->setFilename(file);
00300 }
00301
00302
00303 void p_addVariable(VariablePtr v)
00304 {
00305 p_impl->addVariable(v);
00306 }
00307
00308
00309
00310
00311 void p_addAuxVariable(VariablePtr v)
00312 {
00313 p_impl->addAuxVariable(v);
00314 }
00315
00316
00317 void p_addConstraint(ConstraintPtr c)
00318 {
00319 p_impl->addConstraint(c);
00320 }
00321
00322
00323 void p_addToGlobalConstraint(const std::string& name, ExpressionPtr expr)
00324 {
00325 p_impl->addToGlobalConstraint(name, expr);
00326 }
00327
00328
00329 void p_createGlobalConstraint(const std::string& name, ConstraintPtr cons)
00330 {
00331 p_impl->createGlobalConstraint(name, cons);
00332 }
00333
00334
00335 void p_addToObjective(ExpressionPtr expr)
00336 {
00337 p_impl->addToObjective(expr);
00338 }
00339
00340
00341 void p_solve(const p_optimizeMethod& m)
00342 {
00343 switch (m) {
00344 case (Maximize):
00345 p_impl->maximize();
00346 break;
00347 case (Minimize):
00348 p_impl->minimize();
00349 break;
00350 default:
00351 BOOST_ASSERT(false);
00352 }
00353 }
00354 };
00355
00356
00357 }
00358 }
00359
00360
00361 #endif